home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / asm / asm-kurs.lha / kurse / Teil31.TXT < prev    next >
Encoding:
Text File  |  1992-09-02  |  13.4 KB  |  283 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1991
  2.  
  3.                                 31.Teil...
  4.  
  5. So, vor einigen Kapiteln habe ich euch ja schon vom VBI erzaehlt, und
  6. seinen Aufbau und seine Aufgaben erzaehlt. Damit habe ich es dann belassen,
  7. weil ich meinte das man ihn zu dem Zeitpunkt noch nicht brauchen wuerde.
  8.  
  9. Das ist jetzt anders - Wir stehen vor dem Ersten Intro, und da koennen wir
  10. den VBI schon sehr gut gebrauchen, finde ich.
  11.  
  12. Nochmal kurz zur Erinnerung:
  13. Den VBI fuehrt der Amiga jedesmal auf, wenn der Prozessor das entsprechende
  14. Signal auf seine Leitung bekommt. Das bekommt er jedesmal wenn der
  15. Elektronenstrahl das Vertical Blanking erreicht. Das Vertical Blanking
  16. heisst so, weil dann wenn der Elektronenstrahl diesen Bereich durchquert
  17. nciths auf dem Bildschirm dargestellt wird. Die Bitplane und Sprite DMA ist
  18. dort gesperrt, was dem Prozessor schneller macht. Schon deshalb bietet sich
  19. der VBI gut fuer Zeitaufwendige Routinen an.
  20. Desweiteren spielt das Timing eine Rolle. Der Vorteil der Timingschleife
  21. die wir bis jetzt benutzt haben liegt eindeutig in ihrer kuerze, deswegen
  22. werde ich sie auch weiterhin als beste loesung benutzen. Aber wir gehen die
  23. Schleife ja mit dem Prozessor durch. Wenn wir also in der Schleife noch
  24. eine Menge andere taetigkeiten ausfuehren lassen, dann kann es sehr schnell
  25. vorkommen das diese taetigkeiten, in der Prozessorzeit laenger brauchen als
  26. wie der Elektronenstrahl eine Rasterzeile aufbaut. Das heisst weiter das
  27. der Prozessor abundzu mal eine Zeile nicht `Mitbekommt`. Die Konsequenz
  28. waere dann das es vorkomen koennte das er mal fuer eine 50stel sekunde mit
  29. dem intro nicht weiter macht, und das merkt man schon sehr wohl im
  30. Introgenuss. Beim VBI ist das ja etwas anders, dort kann der Prozessor
  31. seiner aufgetragenen Arbeit folgen, und wird dann von VBI-Signal
  32. unterbrochen.
  33. Er springt dann ueber den Vector der bei $0000006c indirekt an seine
  34. VBI-IRQ-Routine.
  35. Das ist dann der Punkt an den wir uns `Einhaengen` koennen. Das koennen wir
  36. in zwei arten tun.
  37. Wenn wir Taetigkeiten ausfuehren wollen die neben dem normalen
  38. `Amiga-Arbeitstag` erledigt werden sollen, dann muessen wir uns den Wert
  39. der bei $6c liegt merken, den Vector auf unsere Routine verbiegen, und nach
  40. abarbeitung unserer Routine das IRQ-Programm durch einen Sprung, dahin
  41. wohin der Vector zeigte, fortsetzen.
  42. Die zweite Art ist die, die uns interessiert. Dabei merken wir uns
  43. naemlich den Wert der in $6c steht, schreiben die Adresse unserer Routine
  44. dort hin, und lassen es so. Nachdem das Intro/Demo beendet wird, stellen
  45. wir einfach den Vectoor wieder auf den alten Wert, und alles ist wie
  46. vorher.
  47.  
  48. Hier jetzt mal alle schritte die zur Initialisierung eines eigenen VBI und
  49. der Re-Initialisierung des alten VBI noetig waeren.
  50.  
  51. Diese Routine ist fuer beide beschriebene Verwendungen tauglich, das sie
  52. die Eingangswerte Dmacon, Intena und den VBI-Vector ($6c) Buffert, und nach
  53. dem Mausclick umrechnen und wieder zurueckschreiben.
  54.  
  55.  
  56. Dmacon=         $DFF096
  57. Dmaconr=        $DFF002
  58. Intreq=         $DFF09C
  59. Intena=         $DFF09A
  60. Intenar=        $DFF01C
  61. Ciaapra=        $BFE001
  62.  
  63.         Move.w  Intenar,Intenabuffer    ; Inhalt von Intena sichern
  64.         Move.w  Dmaconr,Dmaconbuffer    ; Inhalt von Dmacon sichern
  65.         Move.w  #$7fff,Intena           ; Intena loeschen
  66.         Move.w  #$7fff,Dmacon           ; Dmacon loeschen
  67.         Move.l  $006c.w,Oldirq          ; Alten IRQ Vector nach Oldirq
  68.                                         ; retten
  69.         Move.l  #Newirq,$006c.w         ; Adresse von Newirq aus dem Source
  70.                                         ; in den Zeiger schreiben.
  71.         Move.w  #$87e0,Dmacon           ; Alle DMA-Kanaele wieder oeffnen
  72.         Move.w  #$c020,Intena           ; VBI anschalten
  73.  
  74. ; Der VBI ist jetzt Initialisiert und laeuft sofort nach dem Zugriff auf
  75. ; Intena.
  76. ; Jetzt koennen die Restlichen einstellungen die nichts mit dem VBI zu tun
  77. ; haben, erledigt werden.
  78.  
  79. Wait:                                   ; Auf Maustaste warten (gaehn)
  80.         Btst    #6,Ciaapra
  81.         Bne.s   Wait
  82.  
  83. ; Bevor alle anderen Einstellungen des Intro/Demo geloescht oder auf
  84. ; Default zurueckgestellt werden, sollte mit dieser Routine der VBI wieder
  85. ; auf den Urspruenglichen Wert zurueckgesetzt werden
  86.  
  87.         Or.w    #$8000,Intenabuffer     ; Wert im Intenabuffer auf
  88.                                         ; schreibzugriff umformatieren
  89.         Or.w    #$8000,dmaconbuffer     ; Dasselbe !
  90.         Move.w  #$7fff,Intena           ; Intena loeschen
  91.         Move.w  #$07e0,Dmacon           ; Dmacon loeschen
  92.         Move.l  Oldirq,$006c.w          ; Alten Vector von Oldirq nach $6c
  93.         Move.w  Dmaconbuffer,Dmacon     ; Alten Dmaconwert setzen
  94.         Move.w  Intenabuffer,Intena     ; Alten Intenawert setzen
  95.         Moveq   #0,D0                   ; Zur sicherheit (Cli)
  96.         Rts                             ; Auf Wiedersehen!
  97.  
  98. ; Ab hier beginnt die Routine die im VBI ausgefuehrt werden soll
  99. ; Die vier Zeilen die dort schon stehen, sollten in jede Routine eingebaut
  100. ; werden. Sie garantieren einen Reibungslosen ablauf.
  101.  
  102. Newirq:
  103.         Move.w  #$0020,Intreq           ; VBI bestaetigen
  104.         Movem.l d0-d7/a0-a6,-(sp)       ; Register auf den Stack retten
  105.  
  106. ; So, hier kann das eigene Programm ablaufen.
  107.  
  108.         Movem.l (sp)+,d0-d7/a0-a6       ; Register wieder vom Stack holen
  109.         Rte                             ; RTE - Return from Exeption
  110.  
  111. Oldirq:         dc.l    0
  112. Dmaconbuffer:   dc.w    0
  113. Intenabuffer:   dc.w    0
  114.  
  115.  
  116. So, so schwer ist das doch wirklich nicht, oder?
  117. Programmiermaessig kann man damit genauso arbeiten wie mit der
  118. Endlosschleife die wir bis jetzt immer benutzt haben. Allerdings ist sie
  119. halt bei groesseren Intro/Demo-projekten vorzuziehen, da halt alles ein
  120. ganz kleines bisschen schneller geht (nich viel!).
  121. Wichtig ist auch das ihr das RTE am ende nicht mit RTS vertauscht, denn
  122. sonst laeuft das ganze nicht.
  123. Das letzte was ich noch sagen koennte, wisst ihr aber schon. Waehrend des
  124. VBI, der ja eine normale Exeption (Ausnahmezustand) ist, seit ihr im
  125. Supervisor-Modus des Prozessors...Bringt aber bei der
  126. Intro/Demo-Programmiererei nicht viele Vorteile..Ehrlich gesagt kenne ich
  127. gar keine...Hmmh, ich kenn ja auch den Supervisor-Modus nicht so gut..Aber
  128. das ginge auch etwas weit glaube ich.
  129.  
  130. Am besten probiert ihr mal ein bisschen damit rum, damit ihr ein bisschen
  131. gefuehl fuer die Sache bekommt. Ihr muesst allerdings darauf achten das
  132. ihre den Wert der fuer diese Routine nach Intena und Dmacon geschrieben
  133. wird, eurer Anwendung gerecht sein sollte, da er nicht nur fuer den VBI
  134. gilt, sondern fuer den ganzen Amiga.
  135. Desweiteren muesst ihr aufpassen, damit meine Ich jetzt die, die sich noch
  136. weiter mit anderen Interrupts(Exeptions) befassen wollen, das diese
  137. Routine, da nur fuer den vBI, sehr kurz gehalten werden kann. Eine Routine
  138. die mehrere Interrupts auswerten und durchfuehren kann, wird ungleich
  139. groesser, da jeder Interrupt seine besonderheiten hat, und auch die Zeiten
  140. in denen er auftritt meisst unterschiedlich sind. Ich denke da nur an die
  141. Sprite-Sprite Kollision oder den Diskready Interrupt, sie brauchen genau
  142. wie der VBI die richtigen adressen um ordnungsgemaess arbeiten zu koenen,
  143. sonst laeuft nichts.
  144.  
  145. Ihr koennt diese Routine auch fuer die Zeitmessung einiger Routinen
  146. benutzen, von der ich im zusammenhang der Optimalen Zeitausnutzung im
  147. letzen Teil gesprochen habe. Ihr muesst dazu einfach die Auszumessende(n)
  148. Routine(n) in den VBI einsetzen, und vor jeder Routine die Bildschirmfarbe
  149. aendern oder eine bestimmte Farbe zuweisen. Dann koennt ihr mit dem
  150. Millimetermass die Zeit in Millimeter (toll, wa) messen. Falls einige von
  151. euch noch mit einem Fernseher oder mit einen schlechten Monitor mit grossem
  152. Bildschirmpumpen habt, dann solltet ihr nicht zu hellen farben verwenden,
  153. oder die Kontraste zwischen den Farben nicht zu gross waehlen, da sonst das
  154. sowieso schon ungenaue Ergebniss nicht noch weiter verschlechtert wird.
  155.  
  156. So, da dieser Kursteil zwar schon fertig ist, aber noch nicht lang genug
  157. ist zum abschicken, setze ich noch eine Beschreibung des MC 68000 in den
  158. Teil. Sie erklaert die Pin-belegung und eroertert einige Fragen.
  159.  
  160.  
  161.                             Der 68000 er
  162.  
  163.                        ---------------------
  164.                    D4 |1      |      |    64| D5
  165.                    D3 |2      --------    63| D6
  166.                    D2 |3                  62| D7
  167.                    D1 |4                  61| D8
  168.                    D0 |5                  60| D9
  169.                    AS |6                  59| D10
  170.                  -UDS |7                  58| D11
  171.                  -LDS |8                  57| D12
  172.                  R/-W |9                  56| D13
  173.                -DTACK |10                 55| D14
  174.                   -BG |11                 54| D15
  175.                -BGACK |12                 53| GND
  176.                   -BR |13                 52| A23
  177.                   VCC |14                 51| A22
  178.                   CLK |15                 50| A21
  179.                  -GND |16                 49| VCC
  180.                 -HALT |17                 48| A20
  181.                -RESET |18                 47| A19
  182.                  -VMA |19                 46| A18
  183.                     E |20                 45| A17
  184.                  -VPA |21                 44| A16
  185.                 -BERR |22                 43| A15
  186.                 -IPL2 |23                 42| A14
  187.                 -IPL1 |24                 41| A13
  188.                 -IPL0 |25                 40| A12
  189.                   FC2 |26                 39| A11
  190.                   FC1 |27                 38| A10
  191.                   FC0 |28                 37| A9
  192.                    A1 |29                 36| A8
  193.                    A2 |30                 35| A7
  194.                    A3 |31                 34| A6
  195.                    A4 |32                 33| A5
  196.                        ---------------------
  197.  
  198. Die Stromversorgung: VCC + GND
  199.  
  200. Der 68000 arbeitet mit einer einfachen Versorgungssnung von 5 Volt.
  201. Die Anschluesse sind doppelt ausgelegt und zentral gelegen,um durch kurze
  202. Leitungswege im Gehaeuse die Stromverluste minimal zu halten.
  203.  
  204.  
  205. Der Takteingang: CLK
  206.  
  207. Der 68000 benoetigt lediglich einen einfachen Takt.
  208. Die Frequenz haengt von der gewaehlten Prozessorversion ab.
  209. Im Amiga betraegt die Taktfrequenz 7.16 Mhz.
  210.  
  211.  
  212. Der Datenbuss: D0 - D15
  213.  
  214. Der Datenbuss ist als 16-Bit Buss ausgelegt und kann somit ein Wort (16 Bit)
  215. auf einmal uebertragen.Beim Transfer einzelner Bytes ist jeweils nur eine
  216. Haelfte der Leitungen an der Uebertragung beteiligt.
  217. Entweder wird das Byte ueber die unteren 8 Bit oder ueber die oberen 8 Bit
  218. gelesen bzw. geschrieben.
  219.  
  220.  
  221. Der Adressbuss: A1 - A23
  222.  
  223. Der Adressbus kann mit seinen 23 Leitungen 8 Megaworte Speicher ansprechen.
  224. Da er kein A0 besitzt kann er diesen Speicher nur wortweise adressieren.
  225.  
  226.  
  227. Bussteuerleitungen im asynchronen Modus: AS,R/-W,UDS,LDS,DTACK
  228.  
  229. Der 68000 kann seine Speicherzugriffe grundsaetzlich in zwei verschiedenen
  230. Modi ausfuehren. Im asynchronen Modus signalisiert der Prozessor mit AS
  231. (Adress Strobe/Adresse gueltig) dass eine gueltige Adresse am
  232. Adressbus anliegt.Gleichzeitig bestimmt er mit der R/-W (Read-Write/
  233. Lesen-Schreiben) ob ein Byte/Wort gelesen oder geschrieben werden soll.
  234. Die Wahl zwischen Wort oder Byte treffen die Leitungen UDS und LDS.
  235. Da der Speicher immer wortweise adressiert wird,uebertraegt der Prozessor
  236. bei einem Bytezugriff einfach nur die oberen oder die unteren 8 Bits des
  237. Datenbusses.
  238. Dies signalisiert er durch UDS und LDS.Bei einem Wortzugriff legt er beide
  239. Leitungen auf 0.Will er dagegen auf ein Byte zugreifen,legt er entweder
  240. UDS oder LDS auf 0,die andere Leitung auf 1.
  241. Hat der Prozessor jetzt mit AS,R/-W,UDS und LDS den ihm gewuenschten Zugriff
  242. signalisiert,wartet er,bis der Speicher ihm mitteilt,dass die gewuenschten
  243. Daten bereit sind. Dazu verwendet er die Leitung DTACK,die er auf 0 legt
  244. sobald er die Daten bereitgelegt hat.Schreibt der Prozessor die Daten,teilt
  245. ihm der Speicher durch DTACK mit,dass er die Daten uebernommen hat.
  246. Im asynchronen Modus passt sich der Prozessor also immer an die Geschwindigkeit
  247.  
  248. des Speichers an.
  249.  
  250.  
  251. Bussteuersignale im asynchronen Modus: E,VPA,VMA
  252.  
  253. Um den Sinn dieser Signale besser verstehen zu koennen, muss man die Situation
  254. zum Zeitpunkt der Markteinfuehrung des 68000 kennen. Es waren damals keine
  255. eigenen Periepheriechips fuer den 68000 verfuegbar. Die vorhandenen Chips
  256. von Motorola die ja fuer die 6800-Serie(von der auch der 6502 abstammt)
  257. gedacht waren konnten nicht ohne zusaetzliche Schaltungen in die
  258. asynchrone Bussteuerung eingepasst werden.Also versah man den 68000 bei
  259. Motorola noch mit einem Synchronen Bussmodus,wie man ihn von den 8-Bit
  260. Prozessoren wie dem 6800 oder 6502 kennt.
  261. An der Leitung E liegt staendig ein durch den Faktor 10 geteilter Prozessortakt
  262.  
  263. an,der den Peripheriechips als Takt dient.
  264. Er wird mit dem Phi-2-Eingang des Chips verbunden.
  265. Die Umschaltung von asynchronem Modus in den synchronen erfolgt ueber den
  266. Eingang VPA (Valid Periphial Adress/Gueltige Peripherieadresse).
  267. Dieser Eingang muss von einem externen Adressdcoder auf 0 gelegt werden,
  268. sobald dieser die Adresse eines Peripheriechips erkennt.Der Prozessor
  269. antwortet darauf indem er die Leitung VMA (Valid Memory Adress/Gueltige
  270. Speiher Adresse) ebenfalls auf 0 legt. Der entsprechende Peripherie-
  271. chip muss jetzt innerhalb eines Taktzyklus von E die Daten uebernehmen
  272. bzw. bereitstellen. Danach verlaesst der 68000 automatisch wieder den
  273. synchronen Modus,bis das VPA Signal erneut aktiv wird.
  274.  
  275. Dies bedeutet also,dass der Peripheriechip im synchronen Modus
  276. gezwungen ist,die Daten an einem bestimmten Zeitpunkt bereitzustellen bzw. zu
  277. uebernehmen.
  278.  
  279.  
  280. bis demnaechst
  281.  
  282.                 Jeff Kandle
  283.